#!/bin/bash

# 家族族谱系统一键部署脚本
# Author: AI Assistant
# Date: 2025-08-27

set -e

echo "🚀 开始部署家族族谱系统..."

# 检查环境
check_environment() {
    echo "📋 检查环境..."
    
    # 检查Node.js
    if ! command -v node &> /dev/null; then
        echo "❌ 错误: Node.js未安装"
        echo "请访问 https://nodejs.org 下载并安装Node.js"
        exit 1
    fi
    
    # 检查npm
    if ! command -v npm &> /dev/null; then
        echo "❌ 错误: npm未安装"
        exit 1
    fi
    
    # 检查MySQL
    if ! command -v mysql &> /dev/null; then
        echo "❌ 错误: MySQL未安装"
        echo "请安装MySQL数据库"
        exit 1
    fi
    
    # 检查Git
    if ! command -v git &> /dev/null; then
        echo "❌ 错误: Git未安装"
        echo "请访问 https://git-scm.com 下载并安装Git"
        exit 1
    fi
    
    echo "✅ 环境检查通过"
}

# 安装依赖
install_dependencies() {
    echo "📦 安装依赖..."
    
    # 安装根目录依赖
    echo "   安装根目录依赖..."
    npm install
    
    # 安装前端依赖
    echo "   安装前端依赖..."
    cd frontend
    npm install
    cd ..
    
    # 安装后端依赖
    echo "   安装后端依赖..."
    cd backend
    npm install
    cd ..
    
    echo "✅ 依赖安装完成"
}

# 初始化数据库
init_database() {
    echo "🗄️ 初始化数据库..."
    
    # 检查MySQL连接
    if ! mysql -u root -p123456 -e "SELECT 1;" &> /dev/null; then
        echo "❌ 错误: 无法连接到MySQL数据库"
        echo "请检查MySQL是否运行以及用户名密码是否正确"
        exit 1
    fi
    
    # 执行数据库初始化脚本
    mysql -u root -p123456 < database/init.sql
    
    echo "✅ 数据库初始化完成"
}

# 构建项目
build_project() {
    echo "🔨 构建项目..."
    
    # 构建前端
    echo "   构建前端..."
    cd frontend
    npm run build
    cd ..
    
    # 构建后端
    echo "   构建后端..."
    cd backend
    npm run build
    cd ..
    
    echo "✅ 项目构建完成"
}

# 生成Prisma客户端
generate_prisma_client() {
    echo "🔧 生成Prisma客户端..."
    
    cd backend
    npm run db:generate
    cd ..
    
    echo "✅ Prisma客户端生成完成"
}

# 运行数据库迁移
run_database_migrations() {
    echo "🔄 运行数据库迁移..."
    
    cd backend
    npm run db:migrate
    cd ..
    
    echo "✅ 数据库迁移完成"
}

# 创建必要的目录
create_directories() {
    echo "📁 创建必要的目录..."
    
    # 创建上传目录
    mkdir -p uploads
    mkdir -p backend/uploads
    mkdir -p backend/logs
    
    # 创建日志目录
    mkdir -p logs
    
    echo "✅ 目录创建完成"
}

# 设置环境变量
setup_environment() {
    echo "⚙️ 设置环境变量..."
    
    # 检查环境变量文件
    if [ ! -f backend/.env ]; then
        echo "   复制环境变量配置文件..."
        cp backend/.env.example backend/.env
        echo "   ⚠️  请编辑 backend/.env 文件设置正确的配置"
    fi
    
    echo "✅ 环境变量设置完成"
}

# 启动开发服务器
start_development_server() {
    echo "🚀 启动开发服务器..."
    
    # 在后台启动服务
    echo "   启动后端服务..."
    cd backend
    npm run dev &
    BACKEND_PID=$!
    cd ..
    
    echo "   启动前端服务..."
    cd frontend
    npm run dev &
    FRONTEND_PID=$!
    cd ..
    
    echo "✅ 开发服务器启动完成"
    echo ""
    echo "🌐 前端地址: http://localhost:3000"
    echo "🔗 后端地址: http://localhost:8000"
    echo "📊 健康检查: http://localhost:8000/health"
    echo ""
    echo "按 Ctrl+C 停止服务"
    
    # 等待用户中断
    wait $BACKEND_PID $FRONTEND_PID
}

# 启动生产服务器
start_production_server() {
    echo "🚀 启动生产服务器..."
    
    # 启动后端服务
    echo "   启动后端服务..."
    cd backend
    npm start &
    BACKEND_PID=$!
    cd ..
    
    # 启动前端服务（假设使用nginx或其他Web服务器）
    echo "   提示：请配置Web服务器指向 frontend/dist 目录"
    
    echo "✅ 生产服务器启动完成"
    echo ""
    echo "🌐 前端服务：请配置Web服务器"
    echo "🔗 后端地址: http://localhost:8000"
    echo "📊 健康检查: http://localhost:8000/health"
    
    # 等待用户中断
    wait $BACKEND_PID
}

# 显示帮助信息
show_help() {
    echo "家族族谱系统部署脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help     显示帮助信息"
    echo "  -d, --dev      开发模式部署"
    echo "  -p, --prod     生产模式部署"
    echo "  -i, --init     仅初始化环境"
    echo "  -b, --build    仅构建项目"
    echo ""
    echo "示例:"
    echo "  $0 --dev       # 开发模式部署"
    echo "  $0 --prod      # 生产模式部署"
    echo "  $0 --init      # 仅初始化环境"
    echo "  $0 --build     # 仅构建项目"
}

# 主函数
main() {
    local mode="dev"
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -d|--dev)
                mode="dev"
                shift
                ;;
            -p|--prod)
                mode="prod"
                shift
                ;;
            -i|--init)
                mode="init"
                shift
                ;;
            -b|--build)
                mode="build"
                shift
                ;;
            *)
                echo "❌ 未知选项: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    echo "🎯 部署模式: $mode"
    echo ""
    
    case $mode in
        "dev")
            check_environment
            install_dependencies
            create_directories
            setup_environment
            init_database
            generate_prisma_client
            run_database_migrations
            build_project
            start_development_server
            ;;
        "prod")
            check_environment
            install_dependencies
            create_directories
            setup_environment
            init_database
            generate_prisma_client
            run_database_migrations
            build_project
            start_production_server
            ;;
        "init")
            check_environment
            install_dependencies
            create_directories
            setup_environment
            init_database
            generate_prisma_client
            run_database_migrations
            echo "✅ 环境初始化完成"
            ;;
        "build")
            install_dependencies
            build_project
            echo "✅ 项目构建完成"
            ;;
        *)
            echo "❌ 无效的模式: $mode"
            show_help
            exit 1
            ;;
    esac
}

# 运行主函数
main "$@"